package com.wx.gof.pattern.structural.proxy.dynamicproxy.cglib;

import com.wx.gof.pattern.structural.proxy.Jay;
import com.wx.gof.pattern.structural.proxy.Person;
import com.wx.gof.pattern.structural.proxy.Singer;

import static com.wx.gof.pattern.structural.proxy.Jay.SONG_NAME_2;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 为其他对象提供一种代理，控制对象的访问权限
 * 解释:
 * 代理对象在客户端与目标对象之间起到一个中介的作用，代理对象拥有一些目标对象的行为，能随意控制这些行为，可以暴露这些行为，也可以不暴露这些行为，
 * 可以对这些行为做前置增强 后置增强等等
 * 适用场景:
 * 1.保护目标对象
 * 2.增强目标对象
 * 优点:
 * 1.将代理对象与真实被调用的目标对象分离，在一定程度上降低了系统的耦合度
 * 2.保护目标对象
 * 3.增强目标对象
 * 缺点:
 * 1.类的数目增加(需要增加一个代理类)
 * 2.在客户端和目标对象增加一个代理对象，会造成请求处理速度变慢
 * 3.增加系统复杂度
 * 理解:
 * 应用程序-cglib-动态代理(AOP就是典型的代理模式案例)
 * @Date 2018-12-12-20:48
 */
public class Application {
    public static void main(String[] agrs){
      Object proxy  = new JayCglibProxy(new Jay()).bind();
        Person jayPerson= (Person)proxy;
        System.out.println(jayPerson.life());
        Singer jaySinger = (Singer)proxy;
        jaySinger.sign();
        jaySinger.sing(SONG_NAME_2);
        jaySinger.work();
    }
}
